<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02_显示原型与隐式原型</title>
</head>

<body>
    <!-- 
            1.每个函数function都有一个prototype, 即显式原型（属性） 
            2.每个实例对象都有一个_proto_, 可称为隐式原型到（属性） 
            3。对象的隐式原型的值为其对应构造函数的显式原型的值 
            4.内存结（图） 
            5.总结： 
                *函数的prototype属性：在定义函数时自动添加的，默认值是一个空Object对象 
                *米对象的_proto属性：创建对象时自动添加的，默认值为构造函数的prototype属性值 
                *程序员能直接操作显式原型，但不能直接操作隐式原型(E之前) 
        -->
    <script type="text/javascript">

        function Fn() {

        }
        //1.每个函数function都有一个prototype, 即显式原型（属性） 
        console.log(Fn.prototype);
        var fn = new Fn();
        //2.每个实例对象都有一个_proto_, 可称为隐式原型到（属性）
        console.log(fn.__proto__);
        //3。对象的隐式原型的值为其对应构造函数的显式原型的值 
        console.log(Fn.prototype === fn.__proto__);

        Fn.prototype.test = function () {
            console.log('test');
        }

        fn.test();

        function Person() {

        }

        var person = new Person();

        console.log(person.__proto__ == Person.prototype) // true
        console.log(Person.prototype.constructor == Person) // true
        // 顺便学习一个ES5的方法,可以获得对象的原型
        console.log(Object.getPrototypeOf(person) === Person.prototype) // true



    </script>
</body>

</html>